<?php
/**
 * Created by JetBrains PhpStorm.
 * User: Serenity
 * Date: 20-6-11
 * Time: 10:40
 * To change this template use File | Settings | File Templates.
 */

require_once(Config::acquire('Model', null, 'model'));

define('KEY', '558F9228641C37A9694BAB7C31397');
define('SALT', 'pxNg5ODJha5PF6JoqUeYxDA');

class Medewerker extends Model
{

    /**
     * initialiseren variabelen
     */
    private $id;
    private $voornaam;
    private $achternaam;
    private $gebruikersnaam;
    private $wachtwoord;
    private $clearence;
    private $hiredate;


    /**
     * aanmaken van de vriabelen
     */
    public function __construct($id, $voornaam, $achternaam, $gebruikersnaam, $wachtwoord, $clearence, $hiredate)
    {
        $this->id = $id;
        $this->voornaam = $voornaam;
        $this->achternaam = $achternaam;
        $this->gebruikersnaam = $gebruikersnaam;
        $this->wachtwoord = $wachtwoord;
        $this->clearence = $clearence;
    }


    /**
     * encrypt a string or password
     *
     * @param null $text  default encrypts the password otherwise decrypts the string
     * @return string  returns the encrypted string/password.
     */
    public static function encrypt($text = null)
    {
        return md5(sha1(crc32(md5(base64_decode($text . SALT)) . SALT)));
    }


    /**
     * Query voor deleten van de gegevens uit de gegeven tabel
     */
    public function delete()
    {
        SQL::execute("DELETE FROM `service medewerker` WHERE `Medewerker_ID` = {$this->id}");
    //    $this->__destruct();
    }

     /**
     * gegevens naar een array schrijven.
     */
    public function toArray()
    {
        return array(
            "ID" => $this->id,
            "Voornaam" => $this->voornaam,
            "Achternaam" => $this->achternaam,
            "Gebruikersnaam" => $this->gebruikersnaam,
            "Wachtwoord" => $this->wachtwoord,
            "Clearence" => $this->clearence,
        );
    }

    /**
     * Query voor het updaten van de betreffende tabel
     */
    public function update()
    {
        if (!is_null($this->id)) {
            SQL::execute("UPDATE `service medewerker`
                      SET `Medewerker_Voornaam`       = '{$this->voornaam}',
                          `Medewerker_Achternaam`     = '{$this->achternaam}',
                          `Medewerker_Gebruikersnaam` = '{$this->gebruikersnaam}',
                          `Medewerker_Wachtwoord`     = '{$this->wachtwoord}',
                          `Medewerker_Clearence`      = '{$this->clearence}',
                          `Medewerker_InDienst`       = '{$this->hiredate}'
                      WHERE `Medewerker_ID` ={$this->id}");
        } else {
            SQL::execute("INSERT INTO `ict service`.`service medewerker` (
                            `Medewerker_ID` ,`Medewerker_Voornaam` ,`Medewerker_Achternaam` ,`Medewerker_Gebruikersnaam` ,
                            `Medewerker_Wachtwoord` ,`Medewerker_Clearence` ,`Medewerker_InDienst`)
                             VALUES (NULL ,
                              '{$this->voornaam}',
                              '{$this->achternaam}',
                              '{$this->gebruikersnaam}',
                              '{$this->wachtwoord}',
                              '{$this->clearence}',
                              '{$this->hiredate}');");
        }
    }

     /**
     * aanmaken van een nieuw item
     */
    public static function create($id, $voornaam, $achternaam, $gebruikersnaam, $wachtwoord, $clearence, $hiredate)
    {
        if (!is_null($id)) {
            return new Medewerker($id, $voornaam, $achternaam, $gebruikersnaam, $wachtwoord, $clearence, $hiredate);
        } else {
            return new Medewerker(null, $voornaam, $achternaam, $gebruikersnaam, self::encrypt($wachtwoord), $clearence, $hiredate);
        }
    }



     /*
     * lezen van de gegvens van 1 enkel item
     */
    public static function read($id)
    {

        $medewerkers = SQL::query("SELECT * FROM `service medewerker` WHERE `Medewerker_ID`=$id");

        if ($medewerkers->isValid()) {
            return Medewerker::create(
                $medewerkers->fetchField('Medewerker_ID'),
                $medewerkers->fetchField('Medewerker_Voornaam'),
                $medewerkers->fetchField('Medewerker_Achternaam'),
                $medewerkers->fetchField('Medewerker_Gebruikersnaam'),
                $medewerkers->fetchField('Medewerker_Wachtwoord'),
                $medewerkers->fetchField('Medewerker_Clearence'),
                $medewerkers->fetchField('Medewerker_InDienst'));
        } else {
            return null;
        }
    }


    /**
     * Lezen van de gegevens in een tabel
     */
    public static function readAll()
    {
        $list = array();
        $medewerkers = SQL::query("SELECT * FROM `service medewerker` ORDER BY 'Medewerker_ID'");
        while ($medewerkers->isValid()) {
            $list[] = Medewerker::create(
                $medewerkers->fetchField('Medewerker_ID'),
                $medewerkers->fetchField('Medewerker_Voornaam'),
                $medewerkers->fetchField('Medewerker_Achternaam'),
                $medewerkers->fetchField('Medewerker_Gebruikersnaam'),
                $medewerkers->fetchField('Medewerker_Wachtwoord'),
                $medewerkers->fetchField('Medewerker_Clearence'),
                $medewerkers->fetchField('Medewerker_InDienst'));
            $medewerkers->next();
        }
        return $list;
    }

    /**
     * Setters & getters
     */
    public function setAchternaam($achternaam)
    {
        $this->achternaam = $achternaam;
    }

    public function getAchternaam()
    {
        return $this->achternaam;
    }

    public function getVolledigeNaam()
    {
        $eVoornaam= $this->voornaam." ";
        $naam = $eVoornaam.$this->achternaam;
        return $naam;
    }

    public function setClearence($clearence)
    {
        $this->clearence = $clearence;
    }

    public function getClearence()
    {
        return $this->clearence;
    }

    public function setGebruikersnaam($gebruikersnaam)
    {
        $this->gebruikersnaam = $gebruikersnaam;
    }

    public function getGebruikersnaam()
    {
        return $this->gebruikersnaam;
    }

    public function setHiredate($hiredate)
    {
        $this->hiredate = $hiredate;
    }

    public function getHiredate()
    {
        return $this->hiredate;
    }

    public function getId()
    {
        return $this->id;
    }

    public function setVoornaam($voornaam)
    {
        $this->voornaam = $voornaam;
    }

    public function getVoornaam()
    {
        return $this->voornaam;
    }

    public function setWachtwoord($wachtwoord)
    {
        $this->wachtwoord = $wachtwoord;
    }

    public function getWachtwoord()
    {
        return $this->wachtwoord;
    }

    public static function authenticate($username = null, $password = null)
    {
        if (is_null($username) && is_null($password)) {
            if (is_null(Register::get('public key', true))) {
                return "niet ingelogd";
            } else {
                if (strcmp(Register::get('public key', true), KEY) == 0)
                    return true;
                return "niet ingelogd";
            }
        } else {
            $medewerker = SQL::query("SELECT * FROM `service medewerker` WHERE `Medewerker_Gebruikersnaam` = '$username'");
            if ($medewerker->isValid()) {
                if (strcmp(Medewerker::encrypt($password), $medewerker->fetchField('Medewerker_Wachtwoord')) == 0) {
                    Register::set('medewerker_ID', $medewerker->fetchField('Medewerker_ID'), true);
                    Register::set('public key', KEY, true);
                    return true;
                }
                return 'Onjuist wachtwoord';
            }
            return 'onjuiste gebruikersnaam.';
        }
    }


}
